AWS再入門ブログリレー Amazon CloudFront 編
当エントリは弊社コンサルティング部による『AWS 再入門ブログリレー 2019』の9日目のエントリです。
このブログリレーの企画は、普段AWSサービスについて最新のネタ・深い/細かいテーマを主に書き連ねてきたメンバーの手によって、 今一度初心に返って、基本的な部分を見つめ直してみよう、解説してみようというコンセプトが含まれています。
AWSをこれから学ぼう!という方にとっては文字通りの入門記事として、またすでにAWSを活用されている方にとってもAWSサービスの再発見や2019年のサービスアップデートのキャッチアップの場となればと考えておりますので、ぜひ最後までお付合い頂ければ幸いです。
では、さっそくいってみましょう。9日目のテーマは『Amazon CloudFront』です。
目次
Amazon CloudFront とは
AWS を使っているプロジェクトに関わっている方ならば、「CloudFront」というワードを一度は目にした事があるのではないでしょうか。
Amazon CloudFrontとは、「AWS が提供するマネージドなCDN」です。
また、公式ドキュメント によると Amazon CloudFront は以下の様に紹介されています。
Amazon CloudFront は、データ、動画、アプリケーション、および API をすべて開発者にとって使いやすい環境で、低レイテンシーの高速転送により視聴者に安全に配信する高速コンテンツ配信ネットワーク (CDN) サービスです。
CloudFront は、AWS と統合され、どちらの物理的な場所も AWS のグローバルインフラストラクチャならびにその他の AWS サービスと直接接続されます。
CDN に関する知識があれば抵抗なく「なるほど〜」となりそうですが、「AWS 触りたてでネットワークにもあまり詳しくない」な方だと「??」な状態になってしまうかも知れません。
CloudFront への理解を深めるため、AWS の事は一旦忘れてまずは CDN とはどんなものなのか見ていきましょう。
CDN(Content Delivery Network) とは
こんなケースを考えてみる
HTML や JPG などのデータをユーザからのリクエストに応じて返却しているサーバーを考えてみます。
このサーバーは多数のユーザーからのリクエストを一手に受けている為、非常に負荷が高くなっている状態です。
サーバーの負荷を減らす為の仕組み
そこで、サーバーとユーザーの間に別のサーバーを用意し、以下の様な仕組みを考えてみます。
- ユーザーは新たに用意したサーバーに対してアクセスする
2. ユーザーから直接リクエストを受けたサーバーは、大元のサーバーにリクエストを転送する
3. 大元のサーバーは転送されてきたリクエストに対するコンテンツをリクエストを転送してきたサーバーに返却する
4. 大元のサーバーからコンテンツを受け取ったサーバーはコンテンツを自身に保存した上でユーザーに返却する
5. ユーザーから同様のリクエストが来た場合は、ユーザーから直接リクエストを受けたサーバーがコンテンツを保持しているため、大元のサーバーにリクエストを転送する事なくユーザーにコンテンツを返却する
上記の仕組みによって大元のサーバーへのリクエストが減るため、負荷を減らすことが出来ます。
つまり CDN とは
大雑把な説明ではありますが、CDN とは上記の様な「オリジン(サーバー)上のデータ(コンテンツ)をキャッシュ(エッジ)サーバーにキャッシュさせ、負荷を軽減させる仕組み」の事を指します。
またCDN において、大元のサーバーをオリジン(サーバー)、新たに用意したサーバーをキャッシュ(エッジ)サーバー、キャッシュサーバーにデータを保持させる事を キャッシュ と呼ぶ事が多いです。
Amazon CloudFront とは(再)
Amazon CloudFront とは AWS が提供している上記の仕組み(CDN)の事であり、上記の図を AWS のサービスで置き換えると以下の様なイメージとなります。
上記キャッシュサーバーの役割を担うのが Amazon CloudFront で、オリジンには ALB や EC2、S3などの AWS サービスが該当します。AWS 外で管理しているエンドポイントの指定も可能です。
また、Amazon CloudFront はマネージドサービスのため、ユーザーは細かい仕組みを気にする事なく CDN を利用する事が出来ます。
他 AWS サービスとの連携
また、Amazon CloudFront は他の AWS サービスと組み合わせて利用する事が出来ます。
Amazon EC2、Elastic Load Balancing、Amazon S3
Amazon CloudFront は、オリジンとして Amazon EC2、Elastic Load Balancing、Amazon S3 といった他サービスをオリジンとする事が出来ます。※プライベートに管理している HTTP サーバーも指定可能です。
AWS WAF
AWS WAF で作成したウェブ ACL を Amazon CloudFront に適用し、Web アプリケーションファイアウォールを設定することが出来ます。
AWS Shield Advanced
AWS Shield を使用する事で、DDoS 攻撃から Amazon CloudFront を保護する事が出来ます。
Lambda@Edge
Lambda@Edge を使用する事で、CloudFront のエッジロケーション上で関数の実行を行う事が出来ます。
Lambda@Edge を使用したエッジでのコンテンツのカスタマイズ
Amazon CloudFront 使ってみる
それでは実際に Amazon CloudFront を使おうとした時にどんな設定項目があるのかを見ていきましょう。
Distribution
Amazon CloudFront は、各ドメイン毎に Distribution と呼ばれる設定を作成します。
Distribution にて設定できる項目は多いですが、基本的にはどの項目も「オリジンはどんなものか」「キャッシュサーバーはどんな挙動をするのか」「他AWSサービスとの連携に関する設定」の何れかに関する設定です。
Amazon CloudFront を使用して実現したい事を明確にしておく事で、必要な設定項目も見えてくるはずです。
まずはマネジメントコンソール上で Amazon CloudFront のページを開き、「Create Distribution」 を押下します。
次に、Distribution の種類を選択する画面が表示されますが、ここは通常「Web」を選択します。
RTMP は、Amazon S3 バケットをオリジンとしてメディアファイルのストリーミングを行う場合に選択します。
Distribution の種類を選択すると、設定画面に遷移します。入力項目が多く気が滅入りそうですが、一つずつみていきましょう。
Origin Settings
Origin Settings は、文字通りオリジンに関する設定を行います。
- Origin Domain Name
- ここでオリジンを指定します。Amazon S3 バケットまたは HTTP サーバーの DNS 名を指定します。
- Origin Path
- AWS リソースまたはカスタムオリジン内の特定のディレクトリをオリジンとしたい場合に指定します。
- Origin ID
- Distribution 内でオリジンを一意に区別するための文字列を指定します。一つの Distribution に対して複数のオリジンを指定することも出来るためです。
- Origin Custom Headers
- CloudFront がリクエストをオリジンに転送するときに付与されるカスタムヘッダーを指定出来ます。
上記の他に、選択したオリジンによって以下の値を追加で設定出来ます。
- Amazon S3 バケットの場合
- ウェブサイトエンドポイントとして設定されたカスタムオリジン
今回は、事前に作成しておいた Amazon S3バケット をオリジンとして、最低限の値のみ指定してみました。
Default Cache Behavior Settings
Default Cache Behavior Settings では、CloudFront のキャッシュ動作を設定することが出来ます。
- Path Pattern
- リクエストのパスパターン(ex.「*.jpg」)によるキャッシュ動作の割り当てを設定します。新規作成時は(*)で作成されます。
- Viewer Protocol Policy
- 「HTTP も HTTPS も許可する」「HTTPS のみでアクセス可能」の様に CloudFront 経由でコンテンツにアクセスする際のプロトコルポリシーを設定出来ます。
- Allowed HTTP Methods
- CloudFront 経由でコンテンツを操作する際に使用可能な HTTP メソッドを指定出来ます。
- Cached HTTP Methods
- OPTIONS リクエストに対するオリジンのレスポンスを CloudFront 上でキャッシュするか指定出来ます。
- Cache Based on Selected Request Headers
- リクエストヘッダーの値に基づく CloudFront 上でのキャッシュ有無を指定出来ます。
- Whitelist Headers(Cache Based on Selected Request Headers で Whitelist 選択時)
- ここで指定されたヘッダーがリクエストに含まれる場合、CloudFront はオブジェクトをキャッシュします。
- Object Caching
- CloudFront キャッシュの保持期間に関する設定を選択できます。Customize を選択した場合、後述する各 TTL 値を指定できる様になります。
- Minimum TTL、Maximum TTL、Default TTL(Object Caching にて Customize を選択)
- CloudFront がオブジェクトのキャッシュを保持する期間を設定出来ます。
- 基本的には Default TTL の値だけキャッシュが保持(デフォルトは86400秒=1日)されます。
- オリジンがオブジェクトに Cache-Controle ヘッダーを追加してレスポンスを返却した場合、Cache-Controle に指定されている値と、Minimum TTL、Maximum TTL の値を元に実際にオブジェクトのキャッシュが保持される期間が決定されます。
- ウェブディストリビューションで CloudFront がキャッシュにオブジェクトを保持する期間の指定
- Forward Cookies
- CloudFront からオリジンに対して Cookie を転送するか設定することが出来ます。
- Query String Forwarding and Caching
- CloudFront がクエリ文字列のパラメータに基づいてオリジンから返却されるオブジェクトをキャッシュするかどうかを設定出来ます。クエリパラメータによってオリジンが返却されるコンテンツが異なる場合に有効です。
- Smooth Streaming
- Microsoft Smooth Streaming 形式のメディアファイルを配信するが、IIS サーバーがない場合に「Yes」を選択します。
- Restrict Viewer Access (Use Signed URLs or Signed Cookies)
- 署名付き URL によるアクセス制限を行う場合に「Yes」を選択します。コンテンツへのアクセスを信頼されたアカウントからのみに限定することが出来ます。
- Trusted Signers(Restrict Viewer Access(Use Signed URLs or Signed Cookies) で Yes 選択時)
- 署名付き URL によるアクセスを許可する AWS アカウントを指定します。
- Compress Objects Automatically
- リクエストヘッダーに「Accept-Encoding: gzip」が含まれる場合に、CloudFront 上で特定のコンテンツを圧縮するかどうかを選択出来ます。コンテンツを圧縮する事で、ウェブページの高速化に繋がります。
- Lambda Function Associations(CloudFront Event)
- CloudFront 上のイベントをトリガーとして指定した Lambda 関数を実行することが出来ます。
今回は特に設定を変更しません。
Distribution Settings
Distribution Settings では、Distribution 全体に関する設定を行います。
- Price Class
- 作成した Distribution の価格クラスを選択出来ます。「価格クラス = どのエッジロケーションを使用するか」の設定になります。使用するエッジロケーションを少なくする事でコストの低下が期待できますが、一部の地域によってはレイテンシーの延長等が発生するため、パフォーマンス低下とのトレードオフとなります。
- AWS WAF Web ACL
- AWS WAF で作成したウェブ ACL を選択し、CloudFront に対して Web アプリケーションファイアウォールを設定することが出来ます。
- Alternate Domain Names (CNAMEs)
- CloudFront に自動的に割り当てられるドメイン名の代わりに任意のドメイン名を割り当てることが出来ます。
- SSL Certificate
- Alternate Domain Names を指定する場合は、ドメイン名についての SSL/TLS 証明書を選択する必要があります。
- Supported HTTP Versions
- CloudFront がサポートする HTTP バージョンを指定します。一般的には HTTP/2 を指定します。
- Default Root Object
- オブジェクトではなくルート URL(http://www.example.com/)を指定された時に固定のオブジェクトを返却できる様になります。
- Logging
- オブジェクトに対するリクエストを CloudFront にて記録するかどうか選択出来ます。
- Bucket for Logs、Log Prefix、Cookie Logging(Logging にて On を選択時)
- ログを格納する Amazon S3 バケットの指定等、ロギングに関する設定を行えます。
- Enable IPv6
- CloudFront が IPv6 のアドレスに対して応答できる様になります。
- Comment
- Distribution に任意のコメントを紐付ける事が出来ます。
- Distribution State
- 作成した Distribution が使用できるかどうかを設定する事が出来ます。
ここも今回は特に設定を変更せず、「Create Distribution」を押下します。
作成した Distribution にアクセスしてみる
作成した Distribution は一覧画面に表示されます。作成後しばらくは Status が「In Progress」であるため、しばらく待ちます。
Status が 「Deployed」 に変化したら、「hogehoge.cloudfront.net」というドメイン名が作成されているのでこれを使ってアクセスします。
今回は、Origin に指定した Amazon S3 バケットの直下に index.html を配置してあるので、「hogehoge.cloudfront.net/index.html」という URL でアクセスを試みてみます。
すると、Amazon S3 上に保存されている index.html が表示されました!
※アクセス時のURL表示が誤っていたため、修正致しました。(7/12)
実際にキャッシュヒットしているかどうかを curl コマンドを複数回叩いて確認していきます。
1回目
2回目
2回目のアクセスでキャッシュがヒットしていることが確認できました!
さいごに
AWS で環境構築する際には必ずと言って良いほど名前を見る Amazon CloudFront ですが、設定項目が多く(しかも英語!)AWS 初学者にとってはハードルが高いイメージもあるのではないでしょうか。
今回は、「そもそも CDN って何?」というところから、「Amazon CloudFront で何が設定出来るのか」という所に焦点を当ててみました。私自身も使ったことのない設定が多く、改めて学ぶ事が多かったです。
Amazon CloudFront を使いこなして、素敵な CDN ライフを送りましょう!
以上、AWS事業本部の大前でした!
明日は にしざわ の『SSM』編です。お楽しみに!